#include "cxiadvancedview.h"
#include "cxiverticalheaderview.h"
#include "cxiheaderview.h"

#include <QScrollBar>
#include <QTimer>
#include <QCheckBox>
#include <QHBoxLayout>
#include <QToolButton>
#include <QDebug>

namespace cxitable { struct GridColumnConfig {}; } // 若你的项目中已有定义，请去掉这一行

CxiAdvancedView::CxiAdvancedView(QWidget* parent)
    : QTreeView(parent), m_verticalHeader(nullptr), m_conerWidget(nullptr)
{
    // 横向 header（自定义）
    auto header = new CxiHeaderView(Qt::Horizontal, this);
    setHeader(header);

    // 垂直 header（自定义）
    auto verticalHeader = new CxiVerticalHeaderView(this);

    // 显式调用本类 setVerticalHeader（不要调用 QTreeView::setVerticalHeader）
    CxiAdvancedView::setVerticalHeader(verticalHeader);

    // 注入 view 指针，vertical header 需要知道 view 来计算行号位置
    if (m_verticalHeader) {
        m_verticalHeader->setView(this);
    }

    // 连接滚动 -> 触发 verticalHeader 重绘（只保留一次连接）
    if (verticalScrollBar()) {
        connect(verticalScrollBar(), &QScrollBar::valueChanged,
                this, [this](int) {
                    if (m_verticalHeader) m_verticalHeader->update();
                    updateCornerGeometry();
                });
    }

    // 折叠/展开也触发 header 更新
    connect(this, &QTreeView::expanded, this, [this](const QModelIndex&) {
        if (m_verticalHeader) m_verticalHeader->update();
        updateCornerGeometry();
    });
    connect(this, &QTreeView::collapsed, this, [this](const QModelIndex&) {
        if (m_verticalHeader) m_verticalHeader->update();
        updateCornerGeometry();
    });

    // corner widget：使用容器 + 布局 居中放置 checkbox 或 button
    {
        QWidget* cornerContainer = new QWidget(this);
        cornerContainer->setContentsMargins(0,0,0,0);
        QHBoxLayout* layout = new QHBoxLayout(cornerContainer);
        layout->setContentsMargins(0, 0, 0, 0);
        layout->setSpacing(0);
        layout->setAlignment(Qt::AlignCenter);

        if (m_useCheckBox) {
            QCheckBox* checkBox = new QCheckBox(cornerContainer);
            checkBox->setText("");
            checkBox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            layout->addWidget(checkBox);
            connect(checkBox, &QCheckBox::stateChanged, this, [this](int) {
                emit connerButtonClicked();
            });
        } else {
            QToolButton* button = new QToolButton(cornerContainer);
            button->setAutoRaise(true);
            button->setText(QString::fromUtf8("≡"));
            button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            layout->addWidget(button);
            connect(button, &QToolButton::clicked, this, [this]() {
                emit connerButtonClicked();
            });
        }

        cornerContainer->setLayout(layout);
        cornerContainer->show();
        m_conerWidget = cornerContainer;
    }

    // 当 vertical header 的 section 改变时更新 corner 几何
    if (m_verticalHeader) {
        connect(m_verticalHeader, &QHeaderView::sectionResized, this, &CxiAdvancedView::updateCornerGeometry);
        connect(m_verticalHeader, &QHeaderView::sectionMoved, this, &CxiAdvancedView::updateCornerGeometry);
    }

    // 延迟 0ms 再更新一次（让样式、布局、model 等初始化完）
    QTimer::singleShot(0, this, [this]() {
        updateHeaderMargins();
        updateCornerGeometry();
    });
}

CxiAdvancedView::~CxiAdvancedView()
{
}

void CxiAdvancedView::setVerticalHeader(CxiVerticalHeaderView* header)
{
    if (!header) return;

    // 如果已有旧的 vertical header，删除它
    if (m_verticalHeader) {
        m_verticalHeader->deleteLater();
        m_verticalHeader = nullptr;
    }

    m_verticalHeader = header;
    if (m_verticalHeader) {
        m_verticalHeader->setParent(this);
        connect(m_verticalHeader, &QHeaderView::sectionResized, this, &CxiAdvancedView::updateCornerGeometry);
        connect(m_verticalHeader, &QHeaderView::sectionMoved, this, &CxiAdvancedView::updateCornerGeometry);

        // 如果已经有 model，设置给 vertical header
        if (model()) {
            m_verticalHeader->setModel(model());
        }
    }

    updateHeaderMargins();
}

void CxiAdvancedView::setModel(QAbstractItemModel *model)
{
    QTreeView::setModel(model);

    // 确保垂直表头也绑定相同的模型
    if (m_verticalHeader) {
        m_verticalHeader->setModel(model);
    }

    // 重新连接模型信号，以保证垂直表头在数据变化时刷新
    if (model && m_verticalHeader) {
        connect(model, &QAbstractItemModel::rowsInserted, m_verticalHeader, [this]() { m_verticalHeader->update(); });
        connect(model, &QAbstractItemModel::rowsRemoved, m_verticalHeader, [this]() { m_verticalHeader->update(); });
        connect(model, &QAbstractItemModel::modelReset, m_verticalHeader, [this]() { m_verticalHeader->update(); });
        connect(model, &QAbstractItemModel::layoutChanged, m_verticalHeader, [this]() { m_verticalHeader->update(); });
    }
}
void CxiAdvancedView::resizeEvent(QResizeEvent* event)
{
    QTreeView::resizeEvent(event);
    updateHeaderMargins();
    updateCornerGeometry();
}

void CxiAdvancedView::scrollContentsBy(int dx, int dy)
{
    QTreeView::scrollContentsBy(dx, dy);
    if (m_verticalHeader && m_verticalHeader->isVisible())
    {
        // vertical header 的绘制采用 paintEvent 中的坐标映射；
        // 这里确保 header 也刷新并重新计算几何
        updateHeaderMargins();
        updateCornerGeometry();
    }
}

void CxiAdvancedView::updateGeometries()
{
    QTreeView::updateGeometries();
    updateHeaderMargins();
    updateCornerGeometry();
    if (m_verticalHeader) m_verticalHeader->update();
}

void CxiAdvancedView::updateHeaderMargins()
{
    int left = (m_verticalHeader && m_verticalHeader->isVisible()) ? m_verticalHeader->width() : 0;
    int top = (header() && header()->isVisible()) ? header()->height() : 0;
    // 为数据视图预留空间（左侧 vertical header，顶部 horizontal header）
    setViewportMargins(left, top, 0, 0);

    // 把 header 放到正确位置并 raise
    if (header())
    {
        header()->setParent(this);
        header()->move(left, 0);
        header()->raise();
    }
    if (m_verticalHeader)
    {
        m_verticalHeader->setParent(this);
        m_verticalHeader->move(0, top);
        m_verticalHeader->raise();
    }
    if (m_verticalHeader) m_verticalHeader->update();
}

void CxiAdvancedView::updateCornerGeometry()
{
    int left = (m_verticalHeader && m_verticalHeader->isVisible()) ? m_verticalHeader->width() : 0;
    int top = (header() && header()->isVisible()) ? header()->height() : 0;

    if (m_conerWidget)
    {
        bool visible = left > 0 && top > 0;
        m_conerWidget->setVisible(visible);
        if (visible) {
            // corner 容器占据左上角区域，容器内部布局负责子控件居中
            m_conerWidget->setGeometry(0, 0, left, top);
            m_conerWidget->raise();
        }
    }

    if (header()) header()->setGeometry(left, 0, qMax(0, viewport()->width()), top);
    if (m_verticalHeader) m_verticalHeader->setGeometry(0, top, left, qMax(0, viewport()->height()));
}

QModelIndex CxiAdvancedView::indexAt(const QPoint& p) const {
    // indexAt 接收的是 widget 坐标（通常是相对于 this 的坐标），
    // QAbstractItemView::indexAt 期望的是 viewport 坐标（相对于 viewport 的左上角）
    // 因此这里将 widget 坐标转成 viewport 坐标。
    QPoint pt = p;
    if (m_verticalHeader && m_verticalHeader->isVisible()) {
        pt.setX(p.x() - m_verticalHeader->width());
    }
}